# -*- coding = utf-8 -*-
# @Time : 2023/2/18 15:53
# @Author : 龙王赘婿_彪少
# @File : mytcp.py
# @Software: PyCharm

# 功能：tcp
from socket import *
from threading import Thread


class MYTCP:
    '''
    在Python 语言中创建 Socket 服务端程序，需要使用 socket 模块中的socket类。创建 Socket 服务器程序的步骤如下：
    （1） 创建 Socket 对象。
    （2） 绑定端口号。
    （3） 监听端口号。
    （4） 等待客户端Socket 的连接。
    （5） 读取客户端发送过来的数据。
    （6） 向客户端发送数据。
    （7） 关闭客户端Socket 连接。
    （8） 关闭服务端Socket 连接。
    '''

    def tcpserver(self):
        server_socket = socket(AF_INET, SOCK_STREAM)
        server_socket.bind((self.ip, self.port))  # 入口参数为元组
        server_socket.listen(5)  # 最大连接数
        print("waiting connect ....")
        client_socket, client_info = server_socket.accept()
        recv_data = client_socket.recv(1024)
        print(f"收到信息：{recv_data.decode('gbk')}, 来自{client_info}")
        client_socket.close()
        server_socket.close()

    def tcpclient(self):
        client_socket = socket(AF_INET, SOCK_STREAM)
        # client_socket.bind((self.ip, 3000))   //加了这个可能会出问题，每个套接字只用一次
        client_socket.connect((self.ip, 777))
        client_socket.send("hello".encode("gbk"))
        client_socket.close()

    def tcpserver2(self):
        server_socket = socket(AF_INET, SOCK_STREAM)
        server_socket.bind((self.ip, self.port))
        server_socket.listen(5)
        print("等待接收连接")
        client_socket, client_info = server_socket.accept()
        print("一个客户端建立连接成功")
        while True:
            recv_data = client_socket.recv(1024)
            recv_content = recv_data.decode("gbk")
            print(f"收到：{recv_content},来自{client_info}")
            if recv_content == "q":
                break
            msg = input(">")
            client_socket.send(msg.encode("gbk"))
        client_socket.close()
        server_socket.close()

    def tcpclient2(self):
        client_socket = socket(AF_INET, SOCK_STREAM)
        client_socket.connect(("127.0.0.1", 777))
        while True:
            msg = input(">")
            client_socket.send(msg.encode("gbk"))
            if msg == "q":
                break
            recv_data = client_socket.recv(1024)
            print(f"服务器端说:{recv_data.decode('gbk')}")
        client_socket.close()

    def recv_data(self):
        while True:
            recv_data = self.client_socket.recv(1024)
            recv_content = recv_data.decode("utf-8")
            print(f"客户端说：{recv_content}, 来自：{self.client_info}")
            if recv_content == "q":
                break

    def send_data(self):
        while True:
            msg = input(">")
            self.client_socket.send(msg.encode("gbk"))
            if msg == "end":
                print("结束发送消息！")
                break

    def server_init(self):
        self.server_socket = socket(AF_INET, SOCK_STREAM)  # 建立TCP套接字
        self.server_socket.bind(("127.0.0.1", 8899))  # 本机监听8899端口
        self.server_socket.listen(5)
        print("等待接收连接！")
        self.client_socket, self.client_info = self.server_socket.accept()
        print("一个客户端建立连接成功！")
        t1 = Thread(target=self.recv_data)
        t2 = Thread(target=self.send_data)
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        self.client_socket.close()
        self.server_socket.close()

    def recv_data_2(self):
        while True:
            # 接收服务器端数据
            recv_data = self.client_socket_2.recv(1024)  # 最大接收1024字节
            recv_content = recv_data.decode('gbk')
            print(f"服务器端说:{recv_content}")
            if recv_content == "end":
                print("结束接收消息")
                break

    def send_data_2(self):
        while True:
            # 给服务端发消息
            msg = input(">")
            self.client_socket_2.send(msg.encode("gbk"))
            if msg == "end":
                break

    def client_init(self):
        self.client_socket_2 = socket(AF_INET, SOCK_STREAM)
        self.client_socket_2.connect(("127.0.0.1", 777))
        t1 = Thread(target=self.recv_data_2)
        t2 = Thread(target=self.send_data_2)
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        self.client_socket_2.close()

    def __init__(self):
        self.ip = "127.0.0.1"
        self.port = 9000
        # self.tcpserver()
        # self.tcpclient()
        # self.tcpserver2()
        # self.tcpclient2()
        # self.server_init()
        self.client_init()


if __name__ == "__main__":
    t = MYTCP()
